import request from './request';
import { getQiNiuTokenApi } from "@/api/upload";
import * as qiniu from 'qiniu-js'

/**
 * 从服务器获取七牛云上传token
 * @param {String} fileType - 文件类型，如'avatar'
 * @returns {Promise<{token: String, domain: String}>}
 */
async function getQiniuToken(fileType = 'avatar') {
  try {
    // 向后端请求获取七牛云上传token
    const result = await getQiNiuTokenApi()
    return result; // 返回 {token, domain}
  } catch (error) {
    console.error('获取七牛云token失败:', error);
    throw new Error('获取上传凭证失败');
  }
}

/**
 * 将文件直接上传到七牛云
 * @param {File} file - 要上传的文件
 * @param {String} fileType - 文件类型，如'avatar'
 * @param {Function} onProgress - 上传进度回调函数
 * @returns {Promise<{url: String}>} - 上传成功后的文件URL
 */
export async function uploadToQiniu(file, fileType = 'avatar', onProgress = null) {
  try {
    // 获取七牛云上传token
    const { token, domain } = await getQiniuToken(fileType);
    
    // 生成唯一文件名
    const fileName = `${fileType}_${Date.now()}_${Math.random().toString(36).substring(2, 10)}`;
    const fileExtension = file.name.substring(file.name.lastIndexOf('.'));
    const key = `${fileName}${fileExtension}`;
    
    // 设置上传配置
    const config = {
      useCdnDomain: true,
      region: qiniu.region ? qiniu.region.z2 : 'z2' // 兼容不同版本的写法
    };
    
    // 上传进度回调
    const putExtra = {
      fname: file.name,
      mimeType: file.type
    };
    
    // 开始上传
    return new Promise((resolve, reject) => {
      const observable = qiniu.upload(file, key, token, putExtra, config);
      
      // 上传订阅
      observable.subscribe({
        next: (res) => {
          // 上传进度
          if (onProgress && typeof onProgress === 'function') {
            onProgress(res.total.percent);
          }
        },
        error: (err) => {
          reject(err);
        },
        complete: (res) => {
          // 上传完成，返回文件URL
          const url = `${domain}/${res.key}`;
          resolve({ url });
        }
      });
    });
  } catch (error) {
    console.error('上传到七牛云失败:', error);
    throw new Error('文件上传失败');
  }
}